package com.bjpowernode.money.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.bjpowernode.money.mapper.FinanceAccountMapper;
import com.bjpowernode.money.mapper.UserMapper;
import com.bjpowernode.money.model.FinanceAccount;
import com.bjpowernode.money.model.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.concurrent.TimeUnit;

@Service(interfaceClass = UserService.class,version = "1.0.0",timeout = 20000)
@Component
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;
    @Autowired
    FinanceAccountMapper financeAccountMapper;
    @Autowired
    RedisTemplate redisTemplate;

    // 在首页显示 平台用户总人数(存储在redis中)
    @Override
    public Long queryUserCount() {

        //设置redis表key的序列号格式
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //从redis中查询 平台用户总数
        Long userCount = (Long) redisTemplate.opsForValue().get("userCount");

        //判断
        if(userCount==null){
            //加锁
            synchronized (this){
                //双重判断防止缓存穿透
                if(userCount==null){
                    //从数据库中查询
                    userCount = userMapper.selectUserCount();
                    //放入到redis中
                    redisTemplate.opsForValue().set("userCount",userCount,15, TimeUnit.SECONDS);
                }
            }
        }

        return userCount;
    }

    //用户注册页面，根据用户的手机号，查询用户的数量
    @Override
    public int queryUserCountByPhone(String phone) {

        return userMapper.selectUserCountByPhone(phone);
    }

    //注册：1、添加用户信息 ，2、送大礼
    @Override
    public User register(String phone, String loginPassword) {

        User user = new User();
        user.setPhone(phone);
        user.setLoginPassword(loginPassword);
        user.setAddTime(new Date());
        int num = userMapper.insertSelective(user);

        // 开启另外一个线程(或者线程池)，完成送大礼
        if(num==1){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    FinanceAccount financeAccount = new FinanceAccount();
                    financeAccount.setUid(user.getId());
                    financeAccount.setAvailableMoney(888d);
                    financeAccountMapper.insertSelective(financeAccount);
                }
            }).start();
            return user;
        }
        //num 不等于1  返回null 表示失败
        return null;

    }

    //身份认证页面 更新用户信息
    @Override
    public int userReal(User userReal) {
        return userMapper.updateByPrimaryKeySelective(userReal);
    }

    //登录页面 根据账号和密码 匹配用户
    @Override
    public User login(String phone, String loginPassword) {

        /**
         *   按理来说这边登录查询用户的时候，还有将查询到的用户的登录时间修改，
         *   还需要更新的操作，但是这个更新的操作不是特别的重要，为了让客户更快的登录，应该让更新不影响登录这个行为
         *   所以可以将更新登录时间 单独放在一个线程里去执行
         */
         User user = userMapper.selectByPhoneAndLoginPassword( phone,loginPassword);

        if(user!=null){
            //将更新的行为单独放在一个线程里去执行
            new Thread(new Runnable() {
                @Override
                public void run() {
                    user.setLastLoginTime(new Date());
                    userMapper.updateByPrimaryKeySelective(user);
                }
            }).start();
        }
         return user;
    }
}
